#pragma once

#include <gofcl_usbfs_r.h>

typedef enum {
	USBFS_EP_DI_R = 0x900,
	USBFS_EP_DO_R = 0xB00,
} usbfs_ep_re;

typedef enum {
	USBFS_EP0_RR = 0x0,
	USBFS_EP1_RR = 0x20,
	USBFS_EP2_RR = 0x40,
	USBFS_EP3_RR = 0x60,
} usbfs_ep_rre;

typedef enum {
	USBFS_EP_CTL = 0x0,
	USBFS_EP_INTF = 0x8,
	USBFS_EP_LEN = 0x10,
	USBFS_EP_TFSTAT = 0x18,
} usbfs_ep_rrre;

static inline u32_s usbfs_get_ep_q(usbfs_ep_re ep_r, usbfs_ep_rre ep_rr,
				   usbfs_ep_rrre ep_rrr) {
	return USBFS_Q + (u32_s)ep_r + (u32_s)ep_rr + (u32_s)ep_rrr;
}

static inline u32_s usbfs_rreg_ep(usbfs_ep_re io_r, usbfs_ep_rre ep_rr,
				  usbfs_ep_rrre reg_rrr) {
	u32_s reg_q = usbfs_get_ep_q(io_r, ep_rr, reg_rrr);
	return rreg(reg_q);
}

static inline void usbfs_wreg_ep(usbfs_ep_re io_r, usbfs_ep_rre ep_rr,
				 usbfs_ep_rrre reg_rrr, u32_s value) {
	u32_s reg_q = usbfs_get_ep_q(io_r, ep_rr, reg_rrr);
	wreg(reg_q, value);
}
